package com.zhiyou100.taxi.utils;

import org.apache.poi.hssf.usermodel.*;

import java.io.File;
import java.io.FileOutputStream;
import java.lang.reflect.Field;
import java.util.*;


/**
 * @author zhaokuii11@163.com
 * @create 2021-11-16 22:11
 * @Description 解析数据 编程 excel 文件
 */
public class ExcelCreateUtil {
    /**
     * 存储数据 map<类型,数据>
     */
    private static Map<Class<?>, List<?>> MAP = new HashMap<>();

    /**
     * 添加数据
     *
     * @param clazz 类型
     * @param list  数据
     */
    public static void mapPut(Class<?> clazz, ArrayList<?> list) {
        MAP.put(clazz, list);
    }


    /**
     * @param path 路径+文件的名字
     * @return 创建了几个 工作薄
     * @throws Exception
     */
    public static Integer createExcel(String path) throws Exception {
        File file = new File(path);
        if (!file.exists() && file.isDirectory()) {
            file.mkdirs(); //如果文件不存在就创建
        }

        if (MAP.size() > 0) {
            //创建工作薄
            HSSFWorkbook workbook = new HSSFWorkbook();
            Set<Class<?>> keySet = MAP.keySet();//所有的 字节码文件
            keySet.forEach(key -> {
//                System.out.println(key);
                //创建第一个工作表:【下标0】
                HSSFSheet sheet = workbook.createSheet(key.getSimpleName());

                //创建行 一行一个对象 第一行是对象的属性名
                HSSFRow heat = sheet.createRow(0);
                Field[] fields = key.getDeclaredFields();
                for (int i = 0; i < fields.length; i++) {
                    //System.out.println(fields[i].getName());
                    heat.createCell(i).setCellValue(fields[i].getName());
                }
                final int[] count = {1};
                MAP.get(key).forEach(instance -> { //instance 集合循环对象
                    //System.out.println("数据："+instance);

                    //创建单元格 下标+1
                    HSSFRow row = sheet.createRow(count[0]);
                    //写入数据
                    Field[] fieldRow = key.getDeclaredFields();
                    for (int i = 0; i < fieldRow.length; i++) {
                        Field field = fieldRow[i];
                        field.setAccessible(true);

                        try {
                            Class<?> type = field.getType(); //类型
                            Object value = field.get(instance);//值
                            //只能设置 date double boolean string

                            //只设置了包装类
                            if (type == Integer.class || type == Byte.class || type == Short.class || type == Long.class || type == Float.class
                                    || type == int.class || type == byte.class || type == short.class || type == long.class || type == float.class) {
                                //integer 不能转为 double 类型
                                row.createCell(i).setCellValue(Double.parseDouble(value.toString()));
                            } else if (type == String.class) {
                                row.createCell(i).setCellValue(value.toString());
                            } else if (type == Date.class) {
                                //日期类型封装
                                HSSFCellStyle style = workbook.createCellStyle();
                                style.setDataFormat(workbook.createDataFormat().getFormat("yyyy-MM-dd"));
                                HSSFCell cell = row.createCell(i);
                                cell.setCellStyle(style);
                                cell.setCellValue((Date) value);
                            } else if (type == Boolean.class) {
                                row.createCell(i).setCellValue((Boolean) value);
                            } else {
                                //其他类型不进行判断直接 toString 返回
                                row.createCell(i).setCellValue(value.toString());
                            }
                            //row.createCell(i).setCellValue(value);
                        } catch (IllegalAccessException e) {
                            e.printStackTrace();
                        }

                    }
                    count[0]++;
                });
            });
            //写入
            workbook.write(new FileOutputStream(file));
            return MAP.size();
        }
        return -1;
    }

}